package com.cinyi.ormx.android.util;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.json.JSONException;
import org.json.JSONObject;

public class StringHelper {
	// bt字节参考量
	public static final long SIZE_BT = 1024L;
	// KB字节参考量
	public static final long SIZE_KB = SIZE_BT * 1024L;
	// MB字节参考量
	public static final long SIZE_MB = SIZE_KB * 1024L;
	// GB字节参考量
	public static final long SIZE_GB = SIZE_MB * 1024L;
	// TB字节参考量
	public static final long SIZE_TB = SIZE_GB * 1024L;
	
	/**
	 * 两位小数
	 */
	public static final int SACLE = 1; 
	
	public static String formatSize(long size) {
		return formatSize(size,2);
	}
	
	/**
	 * 格式化文件大小显示，如1024KB转换为1MB
	 * @param size
	 * @param flag	指定保留几位小数
	 * @return
	 */
	public static String formatSize(long size, int flag) {
		NumberFormat df = NumberFormat.getNumberInstance();
		df.setMaximumFractionDigits(flag);

		StringBuffer buffer = new StringBuffer();
		if (size <= 0) {
			buffer.append("0B");
		} else if (size < 1000) {
			buffer.append(size);
			buffer.append("B");
		} else if (size < 1024000) {
			buffer.append(df.format(((double) size) / 1024));
			buffer.append("K");
		} else if (size < 1048576000) {
			buffer.append(df.format(((double) size) / 1048576));
			buffer.append("M");
		} else {
			buffer.append(df.format(((double) size) / 1073741824));
			buffer.append("G");
		}
		return buffer.toString();
	}
	
	/**
	 * 格式化长整形显示数据，转化为大单位值,如100000显示为10万
	 * @param count
	 * @return
	 */
	public static String formatCount(long count){ 
		if(count > 10000 ){
			DecimalFormat df=(DecimalFormat)NumberFormat.getInstance();
			df.setMaximumFractionDigits(2);
//			df.applyPattern("0.00");
			return df.format((count/10000)) + "万"; 
		}
		return String.valueOf(count) ;
	}
	
	/**
	 * 判断输入值是否为空值，如null或者空格
	 * @param obj	要判断的对象
	 * @return		true/false,如为空则返回true
	 */
	public static boolean isBlank(Object obj){
    	return obj == null || obj.toString().trim().length() == 0 ;
    }
	
	public static String getString(Object obj,String def){
		if(isBlank(obj)){
			return def ;
		}
		if("null".equals(obj.toString().toLowerCase())){
			return def ;
		}
		return obj.toString();
	}
	
	/**
	 * 判断整数类型
	 * @param obj	要验证的整数类型
	 * @return		如果是非数字则返回-1，否则返回该整数数值
	 */
	public static int isInteger(Object obj){
    	if(isBlank(obj)){
    		return -1 ;
    	}
    	try {
			int result = Integer.parseInt(obj.toString());
			return result ;
		} catch (Exception e) {
			// TODO: handle exception
		}
    	return -1 ;
    }
	
	/**
	 * 获取int对象值，添加默认值和转换处理
	 * @param obj
	 * @param def
	 * @return
	 */
	public static int getInt(String obj,int def){
    	if( obj == null || obj.toString().trim().length() == 0 ){
    		return def;
    	}
    	try{
    		return Integer.parseInt(obj);
    	}catch (Exception e) {
    		e.printStackTrace();
		}
    	return def ;
    }
	
	/**
	 * 获取long对象值，添加默认值和转换处理
	 * @param obj
	 * @param def
	 * @return
	 */
	public static long getLong(Object obj,long def){
    	if( obj == null || obj.toString().trim().length() == 0 ){
    		return def;
    	}
    	try{
    		return Long.parseLong(obj.toString());
    	}catch (NumberFormatException e) {
    		//
		}
    	return def ;
    }
	
	/**
	 * 根据url连接简单分析下载名称，一般该名称较直接，但在链接分析中如果有名称信息，将会代替该名字<br>
	 * 如果以上无法分析出下载文件名，则根据当前时间戳为文件名
	 * @param url
	 * @return
	 */
	public static String getFileNameByUrl(String url){
		String fileName = "";
		int pos = url.indexOf("?");
		if(pos !=-1){
			url = url.substring(0,pos);
		}
		pos = url.lastIndexOf("/");
		if(pos != -1){
			fileName = url.substring(pos+1, url.length()); 
		}
		if(isBlank(fileName)){
			fileName = System.currentTimeMillis()+".tmp";
		}
		return fileName ;
	}
	
	public static int parsePersent(long max,long progress){
		if(max == 0 ){
			return 0 ;
		}
		DecimalFormat df2 = new DecimalFormat("###");
		double k = (double) progress/max *100;
		return Integer.parseInt(df2.format(k)) ; 
	}
	
	public static String getDefaultDatetime() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmsss");
		String dateString = formatter.format(currentTime);
		return dateString;
	}

	private static Pattern pattern = Pattern.compile("^[\u4e00-\u9fa5_a-zA-Z0-9]+$");//filename
	public static boolean validateFileName(String name){
		if(!isBlank(name)){
			return pattern.matcher(name).matches();
		}
		return false ;
	}

	public static String getJson(JSONObject json, String tTitle) {
		if(json.has(tTitle)){
			try {
				return getString(json.getString(tTitle),"");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return "";
	}
	
	public static int getJson(JSONObject json, String tTitle,int def) {
		if(json.has(tTitle)){
			try {
				return json.getInt(tTitle);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return def ;
	}
	
	public static double getJson(JSONObject json, String tTitle,double def) {
		if(json.has(tTitle)){
			try {
				return json.getDouble(tTitle);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return def ;
	}
	
	public static long getJson(JSONObject json, String tTitle,long def) {
		if(json.has(tTitle)){
			try {
				return json.getLong(tTitle);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return def ;
	}
	
	public static int getStrLenth(String str){
        if(str==null || str.length()<0){
            return 0;
        }
        int len=0;
        char c;
        for(int i=str.length()-1;i>=0;i--){
            c=str.charAt(i);
            if (c > 255) {
                /*
                 * GBK 编码格式 中文占两个字节
                 * UTF-8 编码格式中文占三个字节 len += 3;
                 */
                len += 2;
            } else {
                len++;
            }
        }
        return len;
    }

	/**  
     * 验证输入密码条件(字符与数据同时出现)  
     * @param 待验证的字符串  
     * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false </b>  
     */    
    public static boolean IsPassword(String str)    
    {    
        String regex = "[A-Za-z]+[0-9]";    
        return match(regex, str);    
    }    
        
    /**  
     * 验证输入密码长度 (6-18位)  
     * @param 待验证的字符串  
     * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false </b>  
     */    
    public static boolean IsPasswLength(String str)    
    {    
        String regex = "^\\d{6,16}$";    
        return match(regex, str);    
    }    
	
    /**  
     * @param regex 正则表达式字符串  
     * @param str 要匹配的字符串  
     * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;  
     */    
    private static boolean match(String regex, String str)    
    {    
        Pattern pattern = Pattern.compile(regex);    
        Matcher matcher = pattern.matcher(str);    
        return matcher.matches();    
    }    
    
    public static boolean isEmailFormat(String email) {
		boolean flag = false;
		try {
			String check = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
			Pattern regex = Pattern.compile(check);
			Matcher matcher = regex.matcher(email);
			flag = matcher.matches();
		} catch (Exception e) {
			flag = false;
		}

		return flag;
	}
    
    /**
	 * 判断给定字符串是否空白串。
	 * 空白串是指由空格、制表符、回车符、换行符组成的字符串
	 * 若输入字符串为null或空字符串，返回true
	 * @param input
	 * @return boolean
	 */
	public static boolean isEmpty( String input ) 
	{
		if ( input == null || "".equals( input ) )
			return true;
		
		for ( int i = 0; i < input.length(); i++ ) 
		{
			char c = input.charAt( i );
			if ( c != ' ' && c != '\t' && c != '\r' && c != '\n' )
			{
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 
	 * @description 获取一段字符串的字符个数（包含中英文，一个中文算2个字符）
	 * 
	 * @param content
	 * 
	 * @return
	 */

	public static int getCharacterNum(final String content) {
		if (null == content || "".equals(content)) {
			return 0;
		} else {
			return (content.length() + getChineseNum(content));
		}

	}

	/**
	 * 
	 * @description 返回字符串里中文字或者全角字符的个数
	 * 
	 * @param s
	 * 
	 * @return
	 */

	public static int getChineseNum(String s) {
		int num = 0;
		char[] myChar = s.toCharArray();
		for (int i = 0; i < myChar.length; i++) {
			if ((char) (byte) myChar[i] != myChar[i]) {
				num++;
			}
		}

		return num;

	}
	
}
